package com.colin.app.activity.view.webview;

import android.annotation.TargetApi;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.colin.app.R;
import com.colin.app.activity.view.ViewContract;
import com.colin.app.activity.view.ViewPresenterImpl;
import com.colin.app.app.AppActivity;
import com.colin.app.bean.DemoBean;
import com.colin.library.help.InitViewHelp;
import com.colin.library.help.LogHelp;
import com.colin.library.help.StringHelp;
import com.colin.library.listener.IWebViewCallBack;

public class WebViewActivity extends AppActivity implements ViewContract.ViewView {
    /**
     * WebSettings
     * JavaScriptInterface
     * WebViewClient
     * WebChromeClient
     */


    private ViewContract.ViewPresenter mViewPresenter = null;
    private LinearLayout linear_webview_content;
    private ProgressBar progress_bar_webview;
    private WebView webview_example_show;

    private String url = "https://www.baidu.com";

    @Override
    protected void onPause() {
        if (null != webview_example_show) {
            webview_example_show.onPause();
        }
        super.onPause();
    }

    @Override
    protected void onResume() {
        if (null != webview_example_show) {
            webview_example_show.onResume();
        }
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        //destroy()：销毁WebView。需要注意的是：这个方法的调用应在WebView从父容器中被remove掉之后。我们可以手动地调用
        if (null != linear_webview_content && null != webview_example_show) {
            linear_webview_content.removeView(webview_example_show);
            webview_example_show.destroy();
        }

        mViewPresenter.destroy();
        mViewPresenter = null;
        super.onDestroy();
    }

    @Override
    public void initPresenter() {
        DemoBean demoBean = getIntent().getExtras().getParcelable("clazz");
        mViewPresenter = new ViewPresenterImpl(this, this, demoBean);
    }


    @Override
    public int initViewLayoutID() {
        return R.layout.activity_web_view;
    }

    @Override
    public void initView() {
        this.linear_webview_content = (LinearLayout) this.findViewById(R.id.linear_webview_content);
        this.progress_bar_webview = (ProgressBar) this.findViewById(R.id.progress_bar_webview);
        this.webview_example_show = (WebView) this.findViewById(R.id.webview_example_show);
//        Bundle bundle = getIntent().getExtras();
//        if (null != bundle) {
//            url = bundle.getString("url");
//        }
        InitViewHelp.getInstance().initWebView(webview_example_show, url, new IWebViewCallBack() {

            @Override
            public void loadUrl(String url) {
                LogHelp.d(url);
            }

            @Override
            public void setTitle(String title) {
                LogHelp.d(title);
            }

            @Override
            public void loadProgress(int gone,int progress) {
                LogHelp.d("progress=="+String.valueOf(progress));
                progress_bar_webview.setProgress(progress);
                progress_bar_webview.setVisibility(gone);
            }

            @Override
            public void error(int errorCode, String description, String failingUrl) {
                LogHelp.e(description);
                LogHelp.e(failingUrl);
                toastShow(description);
            }
        });
//        initWebView();
    }

    private void initWebView() {
        Bundle bundle = getIntent().getExtras();
        if (null != bundle) {
            url = bundle.getString("url");
        }
        if (StringHelp.isEmpty(url)) {
            webview_example_show.loadUrl(mViewPresenter.getWebViewUrl());
        } else {
            webview_example_show.loadUrl(url);
        }

//  String getUrl()：获取当前页面的URL。
//  reload()：重新reload当前的URL，即刷新。
//  boolean canGoBack()：用来确认WebView里是否还有可回退的历史记录。
//  通常我们会在WebView里重写返回键的点击事件，通过该方法判断WebView里是否还有历史记录，若有则返回上一页。
//  boolean canGoForward()：用来确认WebView是否还有可向前的历史记录。
//  boolean canGoBackOrForward(int steps)：以当前的页面为起始点，
//  用来确认WebView的历史记录是否足以后退或前进给定的步数，正数为前进，负数为后退。
//  goBack()：在WebView历史记录后退到上一项。
//  goForward()：在WebView历史记录里前进到下一项。
//  goBackOrForward(int steps)：以当前页面为起始点，前进或后退历史记录中指定的步数，正数为前进，负数为后退。
//  clearCache(boolean includeDiskFiles)：清空网页访问留下的缓存数据。
// 需要注意的时，由于缓存是全局的，所以只要是WebView用到的缓存都会被清空，
// 即便其他地方也会使用到。该方法接受一个参数，从命名即可看出作用。
// 若设为false，则只清空内存里的资源缓存，而不清空磁盘里的。
//  clearHistory()：清除当前webview访问的历史记录。
//  clearFormData()：清除自动完成填充的表单数据。需要注意的是，该方法仅仅清除当前表单域自动完成填充的表单数据，并不会清除WebView存储到本地的数据。
//  onPause()：当页面被失去焦点被切换到后台不可见状态，需要执行onPause操作，该操作会通知内核安全地暂停所有动作，
// 比如动画的执行或定位的获取等。需要注意的是该方法并不会暂停JavaScript的执行，
// 若要暂停JavaScript的执行请使用接下来的这个方法。
//  onResume()：在先前调用onPause()后，我们可以调用该方法来恢复WebView的运行。
//  pauseTimers()：该方法面向全局整个应用程序的webview，它会暂停所有webview的layout，parsing，JavaScript Timer。当程序进入后台时，该方法的调用可以降低CPU功耗。
//  resumeTimers()：恢复pauseTimers时的所有操作。
//  destroy()：销毁WebView。需要注意的是：这个方法的调用应在WebView从父容器中被remove掉之后。我们可以手动地调用
//getScrollY()：该方法返回的当前可见区域的顶端距整个页面顶端的距离，也就是当前内容滚动的距离。
//        getHeight()：方法都返回当前WebView这个容器的高度。其实以上两个方法都属于View。
//        整个HTML页面的高度，但该高度值并不等同于当前整个页面的高度，因为WebView有缩放功能， 所以当前整个页面的高度实际上应该是原始HTML的高度再乘上缩放比例。因此，准确的判断方法应该是
//        pageUp(boolean top)：将WebView展示的页面滑动至顶部
//        pageDown(boolean bottom)：将WebView展示的页面滑动至底部。


//        WebSettings常用方法
        webViewSettings();
        initWebChromeClient();
        initWebViewClient();
    }

    private void webViewSettings() {
        WebSettings settings = webview_example_show.getSettings();
        //支持获取手势焦点
        webview_example_show.requestFocusFromTouch();
        //支持JS
        settings.setJavaScriptEnabled(true);
        //支持插件
        settings.setPluginState(WebSettings.PluginState.ON);
        //设置适应屏幕
        settings.setUseWideViewPort(true);
        settings.setLoadWithOverviewMode(true);
        //支持缩放
        settings.setSupportZoom(false);
        //隐藏原生的缩放控件
        settings.setDisplayZoomControls(false);
        //支持内容重新布局
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        settings.supportMultipleWindows();
        settings.setSupportMultipleWindows(true);
        //设置缓存模式
        settings.setDomStorageEnabled(true);
        settings.setDatabaseEnabled(true);
        settings.setCacheMode(WebSettings.LOAD_DEFAULT);
        settings.setAppCacheEnabled(true);
        settings.setAppCachePath(webview_example_show.getContext().getCacheDir().getAbsolutePath());

        //设置可访问文件
        settings.setAllowFileAccess(true);
        //当webview调用requestFocus时为webview设置节点
        settings.setNeedInitialFocus(true);
        //支持自动加载图片
        if (Build.VERSION.SDK_INT >= 19) {
            settings.setLoadsImagesAutomatically(true);
        } else {
            settings.setLoadsImagesAutomatically(false);
        }
        settings.setNeedInitialFocus(true);
        //设置编码格式
        settings.setDefaultTextEncodingName("UTF-8");
    }

    private void initWebViewClient() {
        webview_example_show.setWebViewClient(new WebViewClient() {

            //页面开始加载时
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                progress_bar_webview.setVisibility(View.VISIBLE);
            }


            //页面完成加载时
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                progress_bar_webview.setVisibility(View.GONE);
            }

            //是否在WebView内加载新页面
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                view.loadUrl(request.toString());
                return true;
            }

            //网络错误时回调的方法
            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
                /**
                 * 在这里写网络错误时的逻辑,比如显示一个错误页面
                 *
                 * 这里我偷个懒不写了
                 * */
            }

            @TargetApi(Build.VERSION_CODES.M)
            @Override
            public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
                super.onReceivedHttpError(view, request, errorResponse);
            }
        });
    }

    private void initWebChromeClient() {
        webview_example_show.setWebChromeClient(new WebChromeClient() {

            private Bitmap mDefaultVideoPoster;//默认的视频展示图

            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
            }

            @Override
            public Bitmap getDefaultVideoPoster() {
                if (mDefaultVideoPoster == null) {
                    mDefaultVideoPoster = BitmapFactory.decodeResource(
                            getResources(), R.drawable.ic_error_warning
                    );
                    return mDefaultVideoPoster;
                }
                return super.getDefaultVideoPoster();
            }

            // 设置网页加载的进度条
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                progress_bar_webview.setProgress(newProgress);
                super.onProgressChanged(view, newProgress);
            }
        });
    }

    @Override
    public void initData() {
        mViewPresenter.setData();
    }

    @TargetApi(Build.VERSION_CODES.M)
    @Override
    public void initListener() {
        this.webview_example_show.setOnScrollChangeListener(new View.OnScrollChangeListener() {
            @Override
            public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                if (webview_example_show.getContentHeight() * webview_example_show.getScale() == (webview_example_show.getHeight() + webview_example_show.getScrollY())) {
                    //已经处于底端
                    LogHelp.d("webview-->已经处于底端");
                }

                if (webview_example_show.getScrollY() == 0) {
                    //处于顶端
                    LogHelp.d("webview-->已经处于顶端");
                }
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_webview, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_web_up:
                Toast.makeText(getApplicationContext(), "页面向上", Toast.LENGTH_SHORT).show();
                webview_example_show.pageUp(true);
                break;
            case R.id.action_web_down:
                Toast.makeText(getApplicationContext(), "页面向下", Toast.LENGTH_SHORT).show();
                webview_example_show.pageDown(true);
                break;
            case R.id.action_web_refresh:
                Toast.makeText(getApplicationContext(), "刷新~", Toast.LENGTH_SHORT).show();
                webview_example_show.reload();
            default:
                return super.onOptionsItemSelected(item);
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //如果按下的是回退键且历史记录里确实还有页面
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webview_example_show.canGoBack()) {
            webview_example_show.goBack();
            return true;
        } else {
//            ToastHelp.showShort(this, getString(R.string.press_again_exit_app));
        }
        return super.onKeyDown(keyCode, event);
    }
}
